iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0

前幾天從類別開始接續講了介面與抽象化,讓我們把 Kolin 裡類別的最後幾塊拼圖補上,先從 data class 開始吧!

Data class

在Kotlin中,data class 是一種特殊的類型,主要用於儲存數值。它內建了一些擴充函式例如:equals()hashCode()toString()copy()。它非常適合用來解決只儲存簡單數值的類別,例如:DTO(數據傳輸對象)。下面我們演示如何使用 data class

// 定義一個data class,表示一個簡單的人物
data class Person(val name: String, val age: Int)

fun main() {
    // 創建一個Person對象
    val person1 = Person("Alice", 30)
    println(person1) // 輸出: Person(name=Alice, age=30)

    // 使用自動生成的equals()方法進行比較
    val person2 = Person("Alice", 30)
    println(person1 == person2) // 輸出: true

    // 解構賦值
    val (name, age) = person1
    println("姓名:$name,年齡:$age") // 輸出: 姓名:Alice,年齡:30
}

從上面範例讀者可能會想問:為什麼宣告要用 val 呢?我不能用 var 嗎?答案是可以喔!我們看下面範例:

data class Person(var name: String, val age: Int)

fun main() {
    // 創建一個Person對象
    val person1 = Person("Alice", 30)
    println(person1) // 輸出: Person(name=Alice, age=30)
		person1.name = "John"

    val (name, age) = person1
    println("姓名:$name,年齡:$age") // 輸出: 姓名:John,年齡:30
}

忽略上面有些不必要的解構部分,你可以看到我用 var 也是可以通的。但是這裡就會牽扯到之後會提到 Functional Programming 的不可變性 (前面其實有說過這塊XD),所以通常來說都會使用 val 去定義 data class

那這時候讀者一定會說:所以你今天介紹了一種類別,然後你告訴我:好喔!這玩意兒賦值後就不能修改!?先別急,如果我們期望對一個 data class 進行修改,我們其實可以像下方範例這樣去複製一份並用 copy() 修改它的內容:

// 複製對象並修改其中的屬性
val olderPerson = person1.copy(age = 35)
println(olderPerson) // 輸出: Person(name=Alice, age=35)

看範例後,各位讀者可能會想:那這樣跟我使用類別有什麼差別?除了簡潔一點、多一些酷酷的原生擴充函式外似乎、修改還要用 copy 我到底有什麼動機?

對!不得不說它跟 class 確實除上述外沒太大區別,但實質上,它提供了一個比較簡潔的介面去方便去閱讀,難道不是嗎?


上一篇
Day 21 Kotlin 抽象化類別
下一篇
Day 23 Sealed class, value class 和 Enum class
系列文
成為一名 Kotlin 後端攻城獅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言